﻿using Prism.Commands;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Mvvm;
using Prism.Unity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Zhy.PrismModule.Views;

namespace Zhy.PrismModule
{
    /// <summary>
    /// 用于页面注册的类
    /// </summary>
    public class Startup : PrismBootstrapper
    {
        /// <summary>
        /// 获取主窗体方法
        /// </summary>
        /// <returns></returns>
        protected override DependencyObject CreateShell()
        {
            // 方式二  简化写法
            return Container.Resolve<MainWindow>();
        }

        /// <summary>
        /// 注册其他页面方法
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }

        /// <summary>
        /// Model的管理，用于管理其他模块的注册
        /// 这个方法需要对其它模块引用才能使用 - 不推荐
        /// </summary>
        /// <param name="moduleCatalog">其他模块管理对象注册</param>
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            // 第一种方式
            //moduleCatalog.AddModule<AModule>();

            // 第二种方式
            //Type type = typeof(AModule);
            //moduleCatalog.AddModule(new ModuleInfo
            //{
            //    ModuleName = type.Name, // 类型名称
            //    ModuleType = type.AssemblyQualifiedName, // 类型-这种方式信息比较全。
            //    // 标记Module按需加载
            //    InitializationMode= InitializationMode.OnDemand
            //});
        }

        /// <summary>
        /// 通过相关配置文件生成Module信息
        /// 通过配置文件方式加载其它模块的注册对象
        /// </summary>
        /// <returns></returns>
        protected override IModuleCatalog CreateModuleCatalog()
        {
            // 其它模块的注册对象加载
            // 第三种方式 - 不推荐使用
            // App.config
            // 这里可以不用引用对应Moduler程序集 - 可以使用
            //return new ConfigurationModuleCatalog(); // 这个方法可以自动加载APP.config信息。
            // 缺点：
            // 1. 不支持将模块放在指定文件夹中。
            // 2. 不支持按需加载也就是懒加载。


            // 第四种方式 - 不推荐使用 - 目前测试有未解决的问题
            // XML文件配置
            // 所有需要加载的Module程序集必须由当前程序集引用
            // 如果引用，会出现以下异常：
            // Prism.Modularity.ModuleTypeLoaderNotFoundException:“There is currently no moduleTypeLoader in the ModuleManager that can retrieve the specified module.”
            //return new XamlModuleCatalog(".\\ModuleConfig.xml"); // 通过xml文件加载其它模块注册类
            //return new XamlModuleCatalog("pack://application:,,,/ZHaoxi.PrismModule;component/ModuleConfig.xml");

            // 第五种方式（推荐）
            // 自动扫描目录方式
            return new DirectoryModuleCatalog()
            {
                // 配置将要扫描的目录
                // 就是去程序根目录下去找ModulePath这个目录，加载这个目录里面的动态库。
                ModulePath = ".\\ModulePath"
            };
            // 优点：
            // 1. 支持将模块放在指定文件夹中。
            // 2. 支持按需加载也就是懒加载。
        }
    }
}
